home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / simpsons.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  5KB  |  181 lines

  1. #include "driver.h"
  2. #include "vidhrdw/generic.h"
  3. #include "vidhrdw/konamiic.h"
  4.  
  5. static int bg_colorbase,sprite_colorbase,layer_colorbase[3];
  6. unsigned char *simpsons_xtraram;
  7. static int layerpri[3];
  8.  
  9.  
  10. /***************************************************************************
  11.  
  12.   Callbacks for the K052109
  13.  
  14. ***************************************************************************/
  15.  
  16. static void tile_callback(int layer,int bank,int *code,int *color)
  17. {
  18.     *code |= ((*color & 0x3f) << 8) | (bank << 14);
  19.     *color = layer_colorbase[layer] + ((*color & 0xc0) >> 6);
  20. }
  21.  
  22.  
  23. /***************************************************************************
  24.  
  25.   Callbacks for the K053247
  26.  
  27. ***************************************************************************/
  28.  
  29. static void sprite_callback(int *code,int *color,int *priority_mask)
  30. {
  31.     int pri = (*color & 0x0f80) >> 6;    /* ??????? */
  32.     if (pri <= layerpri[2])                                *priority_mask = 0;
  33.     else if (pri > layerpri[2] && pri <= layerpri[1])    *priority_mask = 0xf0;
  34.     else if (pri > layerpri[1] && pri <= layerpri[0])    *priority_mask = 0xf0|0xcc;
  35.     else                                                 *priority_mask = 0xf0|0xcc|0xaa;
  36.  
  37.     *color = sprite_colorbase + (*color & 0x001f);
  38. }
  39.  
  40.  
  41. /***************************************************************************
  42.  
  43.     Start the video hardware emulation.
  44.  
  45. ***************************************************************************/
  46.  
  47. int simpsons_vh_start( void )
  48. {
  49.     if (K052109_vh_start(REGION_GFX1,NORMAL_PLANE_ORDER,tile_callback))
  50.         return 1;
  51.     if (K053247_vh_start(REGION_GFX2,NORMAL_PLANE_ORDER,sprite_callback))
  52.     {
  53.         K052109_vh_stop();
  54.         return 1;
  55.     }
  56.  
  57.     return 0;
  58. }
  59.  
  60. void simpsons_vh_stop( void )
  61. {
  62.     K052109_vh_stop();
  63.     K053247_vh_stop();
  64. }
  65.  
  66. /***************************************************************************
  67.  
  68.   Extra video banking
  69.  
  70. ***************************************************************************/
  71.  
  72. static READ_HANDLER( simpsons_K052109_r )
  73. {
  74.     return K052109_r(offset + 0x2000);
  75. }
  76.  
  77. static WRITE_HANDLER( simpsons_K052109_w )
  78. {
  79.     K052109_w(offset + 0x2000,data);
  80. }
  81.  
  82. static READ_HANDLER( simpsons_K053247_r )
  83. {
  84.     if (offset < 0x1000) return K053247_r(offset);
  85.     else return simpsons_xtraram[offset - 0x1000];
  86. }
  87.  
  88. static WRITE_HANDLER( simpsons_K053247_w )
  89. {
  90.     if (offset < 0x1000) K053247_w(offset,data);
  91.     else simpsons_xtraram[offset - 0x1000] = data;
  92. }
  93.  
  94. void simpsons_video_banking(int bank)
  95. {
  96.     if (bank & 1)
  97.     {
  98.         cpu_setbankhandler_r(3,paletteram_r);
  99.         cpu_setbankhandler_w(3,paletteram_xBBBBBGGGGGRRRRR_swap_w);
  100.     }
  101.     else
  102.     {
  103.         cpu_setbankhandler_r(3,K052109_r);
  104.         cpu_setbankhandler_w(3,K052109_w);
  105.     }
  106.  
  107.     if (bank & 2)
  108.     {
  109.         cpu_setbankhandler_r(4,simpsons_K053247_r);
  110.         cpu_setbankhandler_w(4,simpsons_K053247_w);
  111.     }
  112.     else
  113.     {
  114.         cpu_setbankhandler_r(4,simpsons_K052109_r);
  115.         cpu_setbankhandler_w(4,simpsons_K052109_w);
  116.     }
  117. }
  118.  
  119.  
  120.  
  121. /***************************************************************************
  122.  
  123.   Display refresh
  124.  
  125. ***************************************************************************/
  126.  
  127. /* useful function to sort the three tile layers by priority order */
  128. static void sortlayers(int *layer,int *pri)
  129. {
  130. #define SWAP(a,b) \
  131.     if (pri[a] < pri[b]) \
  132.     { \
  133.         int t; \
  134.         t = pri[a]; pri[a] = pri[b]; pri[b] = t; \
  135.         t = layer[a]; layer[a] = layer[b]; layer[b] = t; \
  136.     }
  137.  
  138.     SWAP(0,1)
  139.     SWAP(0,2)
  140.     SWAP(1,2)
  141. }
  142.  
  143. void simpsons_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  144. {
  145.     int layer[3];
  146.  
  147.  
  148.     bg_colorbase       = K053251_get_palette_index(K053251_CI0);
  149.     sprite_colorbase   = K053251_get_palette_index(K053251_CI1);
  150.     layer_colorbase[0] = K053251_get_palette_index(K053251_CI2);
  151.     layer_colorbase[1] = K053251_get_palette_index(K053251_CI3);
  152.     layer_colorbase[2] = K053251_get_palette_index(K053251_CI4);
  153.  
  154.     K052109_tilemap_update();
  155.  
  156.     palette_init_used_colors();
  157.     K053247_mark_sprites_colors();
  158.     palette_used_colors[16 * bg_colorbase] |= PALETTE_COLOR_VISIBLE;
  159.     if (palette_recalc())
  160.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  161.  
  162.     tilemap_render(ALL_TILEMAPS);
  163.  
  164.     layer[0] = 0;
  165.     layerpri[0] = K053251_get_priority(K053251_CI2);
  166.     layer[1] = 1;
  167.     layerpri[1] = K053251_get_priority(K053251_CI3);
  168.     layer[2] = 2;
  169.     layerpri[2] = K053251_get_priority(K053251_CI4);
  170.  
  171.     sortlayers(layer,layerpri);
  172.  
  173.     fillbitmap(priority_bitmap,0,NULL);
  174.     fillbitmap(bitmap,Machine->pens[16 * bg_colorbase],&Machine->drv->visible_area);
  175.     K052109_tilemap_draw(bitmap,layer[0],1<<16);
  176.     K052109_tilemap_draw(bitmap,layer[1],2<<16);
  177.     K052109_tilemap_draw(bitmap,layer[2],4<<16);
  178.  
  179.     K053247_sprites_draw(bitmap);
  180. }
  181.